# -*- coding: cp1252 -*-


# HOJA DE TRABAJO O5
# YUCELY BEB 12537
# VICTOR FUENTES 12298
from SimPy import *
from SimPy.Simulation import *
from random import uniform
from random import expovariate, seed
from random import Random, randint
import math

class Customer(Process):
    def __init__(self,id):
        Process.__init__(self)
        self.id=id
        
    def tiempoenBanco(self,driveTime, t2):
        yield hold,self,driveTime
        self.llega = now()
        arrive=now()
        #lista con ventanillas
        clientesxVentanilla = [ len(ventanillas[0].waitQ) + len(ventanillas[0].activeQ),len(ventanillas[1].waitQ) + len(ventanillas[1].activeQ),len(ventanillas[2].waitQ) + len(ventanillas[2].activeQ),len(ventanillas[3].waitQ) + len(ventanillas[3].activeQ),len(ventanillas[4].waitQ) + len(ventanillas[4].activeQ),len(ventanillas[5].waitQ) + len(ventanillas[5].activeQ),len(ventanillas[6].waitQ) + len(ventanillas[6].activeQ),len(ventanillas[7].waitQ) + len(ventanillas[7].activeQ),len(ventanillas[8].waitQ) + len(ventanillas[8].activeQ),len(ventanillas[9].waitQ) + len(ventanillas[9].activeQ),len(ventanillas[10].waitQ) + len(ventanillas[10].activeQ),len(ventanillas[11].waitQ) + len(ventanillas[11].activeQ)]

        for i in range(12): #hay 6 ventanillas
            if clientesxVentanilla[i] == 0 or clientesxVentanilla[i] == min(clientesxVentanilla):
                self.ventanilla = i  #validaciones de ventanillas libres
                break
            
        print "el ",self.id," hace cola en Ventanilla ", self.ventanilla    
        yield request,self,ventanillas[self.ventanilla] #yield para esperar a que ventanillas vacias
        print "%5.1f %s es atentido en ventanilla %d" %(now(),self.id, self.ventanilla)
        #t2=randint(1,30)
        yield hold, self, t2      #t2 para el tiempo random en ventanilla
        print "%5.1f %s termino su servicio %d" %(now(),self.id, self.ventanilla)
        wait=now()-arrive #calculo del tiempo activo dentro del banco
        print "%5.1f %s tiempo en banco %d" %(now(),self.id, wait)
        yield release, self, ventanillas[self.ventanilla]
        
        wt.observe(wait)  #observando con Monitor el valor del wait
        
#tiempo maximo de simulacion
maxTime=1000.0
tiempototal=0

seed(99999)
r=Random(12345)

wt=Monitor()
initialize()
numeroClientes=200 #numero de personas que entran en banco

#ventanillas = [Resource(capacity=1,name="Ventanilla1"), Resource(capacity=1,name="Ventanilla2"),Resource(capacity=1,name="Ventanilla3"),Resource(capacity=1,name="Ventanilla4")]
#agregando 4 ventanillas
ventanillas = [Resource(capacity=1,name="Ventanilla1"), Resource(capacity=1,name="Ventanilla2"),Resource(capacity=1,name="Ventanilla3"),Resource(capacity=1,name="Ventanilla4"),Resource(capacity=1,name="Ventanilla5"),Resource(capacity=1,name="Ventanilla6"),Resource(capacity=1,name="Ventanilla7"),Resource(capacity=1,name="Ventanilla8"),Resource(capacity=1,name="Ventanilla9"),Resource(capacity=1,name="Ventanilla10"),Resource(capacity=1,name="Ventanilla11"),Resource(capacity=1,name="Ventanilla12")]

#for para generar los clientes 
for i in range(numeroClientes):
    t1=randint(1,480)
    ran=randint(1,30)
    c=Customer(id="Cliente "+ str(i))
    activate(c,c.tiempoenBanco(driveTime=t1, t2=ran))

simulate(until=maxTime)


print "Tiempo total en la U: \tpromedio = %5.1f, \n\t\tdesviacion estantar=%2d"%(wt.mean(),wt.var())


